#ifndef FOLDER_H
#define FOLDER_H
#include <string>
#include <set>

class Message;
class Folder
{
    friend class Message;
private:
    std::set<Message*> msgs;
public:    
    Folder() = default;
    Folder(const Folder &);
    ~Folder();
    Folder& operator = (const Folder &);
    void addMsg(Message *m) { msgs.insert(m); }
    void remMsg(Message *m) { msgs.erase(m); }
    void add_to_Messages(const Folder &);
    void remove_from_Messages();
};
/**
 * @brief Construct a new Folder:: Folder object
 *        将 Folder 添加到它所有 Message 的 folder 中
 * 
 * @param f 
 */
Folder::Folder(const Folder &f) : msgs(f.msgs)
{
    add_to_Messages(f);
}
/**
 * @brief Destroy the Folder:: Folder object
 * 
 */
Folder::~Folder()
{
    remove_from_Messages();
}
/**
 * @brief 
 * 
 * @param f 
 */
void Folder::add_to_Messages(const Folder &f)
{
    for (auto msg : f.msgs)
    {
        msg->addFldr(this); // 将这个 Folder 添加到所有 Message 中
    }
}
/**
 * @brief 
 * 
 */
void Folder::remove_from_Messages()
{
    while (!msgs.empty()) // 将这个 Folder 从它所有 Message 中删除
    {
        (*msgs.begin())->remove(*this);        
    }
}
/**
 * @brief 
 * 
 * @param f 
 * @return Folder& 
 */
Folder& Folder::operator=(const Folder &f)
{
    remove_from_Messages(); // 从每个 Message 中删除此 Folder
    msgs = f.msgs; // 从右侧运算对象拷贝 Message 集合
    add_to_Messages(f); // 将此 Folder 添加到每个新 Message 中
    return *this;
}
#endif